import axios, { type AxiosRequestHeaders, type AxiosResponse } from 'axios'
import pinia from '@/stores/index'
import { useUserStore } from '../../stores/userstore'
import { showToast } from 'vant'
/* 定义response对象的data接口 */
interface ResponseData<T> {
	code: number
	data: T //就是response.data.data的类型 后端真正给你的那个数据
	message: string
	ok?: boolean
}
// 创建axios实例
const request = axios.create({
	baseURL: '/sph', // 所有的请求地址前缀部分(没有后端请求不用写)
	timeout: 2000, // 请求超时时间(毫秒)
	withCredentials: true // 异步请求携带cookie
	// headers: {
	// 设置后端需要的传参类型
	// 'Content-Type': 'application/json',
	// 'token': x-auth-token',//一开始就要token
	// 'X-Requested-With': 'XMLHttpRequest',
	// },
})

// request拦截器
request.interceptors.request.use(
	config => {
		// 如果你要去localStor获取token,(如果你有)
		let token = localStorage.getItem('token')
		if (token) {
			// 添加请求头
			;(config.headers as AxiosRequestHeaders).token = token
		}
		return config
	},
	error => {
		// 对请求错误做些什么
		Promise.reject(error)
	}
)

// response 拦截器
request.interceptors.response.use(
	async (response: AxiosResponse<ResponseData<any>, any>) => {
		// 对响应数据做点什么
		const res = response.data
		if (res.code !== 20000 && res.code !== 200) {
			showToast(res.message)
		}
		if (res.code === 208) {
			const storeUserInfo = useUserStore(pinia)
			await storeUserInfo.reset()
			window.location.href = '/login'
			showToast('你已被登出，请重新登录')
			return Promise.reject(request.interceptors.response)
		} else {
			return res.data //对于咱们之后发送请求获取到的数据 其实就是真正的后端给咱们前端返回的数据 真正要用的那个数据 咱们之后不能res.code进行判断了
		}
	},
	error => {
		// 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			showToast('网络超时')
		} else if (error.message == 'Network Error') {
			showToast('网络连接错误')
		} else {
			if (error.response.data) showToast(error.response.statusText)
			else showToast('接口路径找不到')
		}
		return Promise.reject(error)
	}
)
export default request
